#include "dataclass.h"
#include <fstream>
#include <iostream>
#include <QDebug>

using namespace std;


//在主程序中需要做的事情：调用DataClass::findMaxMinData(int begin, int end)函数
//判断end-begin时候大于3941*2：
//若大于，maxData,minData
//若小于，maxData=minData






/* 通过调用DataClass::findMaxMinData(int begin, int end)函数；
 * 可以找到指定范围内数据的最大值和最小值数组，从而获得包络线
 * 而当begin与end之间的数据个数>3941*2的时候，进行取样处理
 * 而当begin与end之间的数据个数<3941*2的时候，将所有数据进行绘制
 *
 * ！！！这里的3940*4是可以更改的，在DataClass::findMaxMinData(int begin, int end)函数中的if语句中修改
*/


DataClass::DataClass(QObject *parent) : QObject(parent)
{

}


/*函数名称：txt2dataV
 * 函数功能：读取选取的二进制文件，然后把其中的数据存储到dataVector数组中
*/
void DataClass::txt2dataV(char *filePath){                   //这里的计算公式需要随时修改

    unsigned char data[1024];
    index=0;

    // 以读模式打开文件
    ifstream infile;
    infile.open(filePath, ios::in | ios::binary);
    while(infile.read((char *)&data, sizeof(data))) { //一直读到文件结束
        //qDebug()<<data[0];
        for (int i=0;i<512;i++) {
//            if(data[2*i+1]>=32){
//                //qDebug()<<data[2*i]<<" "<<data[2*i+1];
//                dataVector[index] = (data[2*i+1]-32)*256 + data[2*i];
//                index++;
//            }
            if(data[2*i+1]<16){
                //qDebug()<<data[2*i]<<" "<<data[2*i+1];
                dataVector[index] = data[2*i+1]*256 + data[2*i];
                index++;
            }
        }
    }

    //目前，读取文件出现的问题：data[0]的值是随意的，正常范围内。data[1]的值出现了问题，得到的值在70左右
    //这明显超出了范围，需求的值应该在0~15，且在0附近浮动，这明显是有问题的.
    //这就导致了在读取过程中，值到达了10000甚至20000。
    //这部分与许仁翰交接一下。


    // 关闭打开的文件
    infile.close();

}


/*函数名称：initializeMaxMin
 * 函数功能：初始化maxData和minData两个数组，清空所有数据
*/
void DataClass::initializeMaxMin(){//!!!!!这里的0需要修改
    //置零
    memset(maxData, 0, 7882*sizeof(int));
    memset(minData, 0, 7882*sizeof(int));
    memset(indData, 0, 7882*sizeof(int));
}

/*函数名称：findMax
 * 参数1：beginN：开始位置
 * 参数2：sizeMe：数据长度
 * 函数功能：找到并返回data数组中，beginN开始的，长度为sizeMe的数据中的最大值
*/
int DataClass::findMaxMin(int beginN, int sizeMe){
    max = dataVector[beginN];
    min = dataVector[beginN];
    for (int i=beginN; i<beginN+sizeMe; i++) {
        if(dataVector[i]>max){
            max = dataVector[i];
        }
        if(dataVector[i]<min){
            min = dataVector[i];
        }
    }
}



/*函数名称：findMaxMinData
 * 参数1：begin：data数组中数据开始角标
 * 参数2：end：data数组中数据结束角标
 * 函数功能：处理data数组中begin到end的数据，进行分割，找到其中各个小组的最大值和最小值，
 *          并存储在maxData和minData数组中
*/
void DataClass::findMaxMinData(int begin, int end){

    initializeMaxMin();

//    iHave = ReadData(path)

    int number = end-begin;
    int remain;

    if(number>7882){
        //采点
        int size = number/3940;
        for (int i = 0; i<3940;i++) {
            findMaxMin(i*size+begin, size);
            maxData[i] = max;
            minData[i] = min;
            indData[i] = i*size+begin;
        }
        if(number>size*3940){
            remain = number-size*3940;
            findMaxMin(3940*size+begin, remain);
            maxData[3940] = max;
            minData[3940] = min;
            indData[3940] = 3940*size+begin;
        }
    }else{
        //直接画
        for (int in=0;in<number;in++) {
            maxData[in] = dataVector[in+begin];
            minData[in] = dataVector[in+begin];
            indData[in] = in+begin;
        }
    }

    //有两种情况
    //第一种：在调用该方法的程序中判断
    //第二种：在该方法中判断,主程序中判断之后，只画maxData即可
    //分析：如果采用第一种方法，会造成主程序逻辑复杂，个人感觉第二种方法更好
}
